﻿/*
-----------------------------------------------------------------------------
VW3D
-----------------------------------------------------------------------------
*/
/* Original version Copyright (C) Scott Bilas, 2000.
 * All rights reserved worldwide.
 *
 * This software is provided "as is" without express or implied
 * warranties. You may freely copy and compile this source into
 * applications you distribute provided that the copyright text
 * below is included in the resulting source code, for example:
 * "Portions Copyright (C) Scott Bilas, 2000"
 */
#ifndef _SINGLETON_H__
#define _SINGLETON_H__

#include <assert.h>

#if VW3D_COMPILER == COMPILER_MSVC
// Turn off warnings generated by this singleton implementation
#   pragma warning (disable : 4311)
#   pragma warning (disable : 4312)
#endif

// Should be placed in the appropriate .cpp file somewhere
#define initialiseSingleton( type ) \
	template < > type * Singleton < type > :: ms_Singleton = 0

// To be used as a replacement for initialiseSingleton( )
//  Creates a file-scoped Singleton object, to be retrieved with getSingleton
#define CreateFileSingleton( type ) \
	initialiseSingleton( type ); \
	type the##type
/** Template class for creating single-instance global classes.
*/
template <typename T> class Singleton
{
protected:

	static T* ms_Singleton;

public:
	Singleton( void )
	{
		assert( !ms_Singleton );
		ms_Singleton = static_cast< T* >( this );
	}
	~Singleton( void )
	{  assert( ms_Singleton );  ms_Singleton = 0;  }
	static T& getSingleton( void )
	{  assert( ms_Singleton );  return ( *ms_Singleton );  }
	static T* getSingletonPtr( void )
	{  return ( ms_Singleton );  }
};
#endif
